package gui.menu;

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormatAlign;
import flash.text.TextFormat;

import gui.menu.MenuItemContainerStyle;

/**
 * ...
 * @author Damien Mabin & Birdy
 */

class MainMenuItem extends MenuItem
{
	public var m_IsPinned			: Bool;
	public var m_Pin				: Sprite;
	public var m_PinOn				: Bitmap;
	public var m_PinOff				: Bitmap;
	public var m_ExpendShadow		: Bitmap;
	
	public static var TREEITEMWIDTH 			: Int = 130;
	public static var TREEITEMHEIGHT 			: Int = 30;
	public static var SEPARATORHEIGHT			: Int = 7;
	public static var PADDINGSIZE				: Int = 3;
	public static var LABELWIDTH				: Int = 100;
	public static var DEFAULT_STYLE				= { backgroundColor : 0x000000, backgroundAlpha : 0.0, borderColor : 0x0000FF, borderAlpha : 0.0, foregroundColor : 0xFFFFFF, foregroundAlpha : 0.6 };
	
	private static var DEFAULT_PINWIDTH			: Int = 15;
	
	
	public function new(?f_TextFormat : TextFormat = null, 
						?f_Style : { backgroundColor : UInt, backgroundAlpha : Float, borderColor : UInt, borderAlpha : Float, foregroundColor : UInt, foregroundAlpha : Float }, 
						?f_IsExtendableArrow : BitmapData = null, 
						?f_HaveMoreChild : Sprite = null, 
						?f_Pin : { on : BitmapData, off : BitmapData } = null, 
						?f_ContainerStyle : MenuItemContainerStyle = null, 
						?f_SaveExtendedState : Bool = false)
	{
		super(MenuItemType.MAIN);
		
		m_Style = ((f_Style == null) ? DEFAULT_STYLE : f_Style);
		m_TextFormat = ((f_TextFormat == null) ? new TextFormat() : f_TextFormat);
		m_IsExtendableArrow = (f_IsExtendableArrow == null) ? new BitmapData(1,1) : f_IsExtendableArrow;
		m_HaveMoreChild = (f_HaveMoreChild == null) ? new Sprite() : f_HaveMoreChild;
		m_ContainerStyle = (f_ContainerStyle == null) ? CASCADE : f_ContainerStyle;
		m_SaveExtendedState = f_SaveExtendedState;
		m_Collapse = true;
		m_ChildContainer.visible = false;
		
		// Gestion de la punaise et de la expendShadow
		m_IsPinned = (f_Pin == null); // Si aucune punaise n'a été définie, on ne cachera jamais le menuItem si ça n'est pas demandé => m_IsPinned est vrai
		if (f_Pin != null)
		{
			m_PinOn = (f_Pin == null) ? new Bitmap() : new Bitmap(f_Pin.on);
			m_PinOff = (f_Pin == null) ? new Bitmap() : new Bitmap(f_Pin.off);		
			m_PinOn.width = m_PinOn.height = m_PinOff.width = m_PinOff.height = DEFAULT_PINWIDTH;
			m_Pin = new Sprite();
			m_Pin.x = m_Pin.y = PADDINGSIZE;
			m_Pin.addChild((m_IsPinned ? m_PinOn : m_PinOff));
			addChild(m_Pin);			
			
			m_ExpendShadow = new Bitmap(new BitmapData(DEFAULT_PINWIDTH + 2 * PADDINGSIZE, 1, false, 0x111111));
			m_ExpendShadow.alpha = 0.3;
			addChild(m_ExpendShadow);
			
			// Décale le ChildContainer de la largeur de la expend Shadow
			m_ChildContainer.x = m_ExpendShadow.width;
			
			// Listeners qui gèrent l'affichage/masquage du premier conteneur d'enfants (celui du MainItem)
			var self = this;
			m_Pin.addEventListener(MouseEvent.CLICK, function(ME : MouseEvent) { self.m_Pin.removeChild((self.m_IsPinned ? self.m_PinOn : self.m_PinOff)); self.m_IsPinned = !self.m_IsPinned; self.m_Pin.addChild((self.m_IsPinned ? self.m_PinOn : self.m_PinOff)); } );
			this.addEventListener(MouseEvent.MOUSE_OVER, function(ME : MouseEvent) { self.Expand();	} );
			this.addEventListener(MouseEvent.MOUSE_OUT,  function(ME : MouseEvent) { if (!self.m_IsPinned) { self.Collapse(); } } );
		}
	}
	
	// Retourne la flèche par défaut qui indique la présence de fils pour un élément
	public static function getDefaultIsExtendableArrow() : BitmapData
	{
		var arrow = new BitmapData(7 + PADDINGSIZE, 8, true, 0x00000000);
		
		var shape = new Shape();
		shape.graphics.beginFill(0xFFFFFFFF);
		shape.graphics.lineStyle(1, 0xFFFFFFFF);
		shape.graphics.moveTo(0, 0);
		shape.graphics.lineTo(7, 4);
		shape.graphics.lineTo(0, 8);
		shape.graphics.lineTo(0, 0);
		shape.graphics.endFill();		
		arrow.draw(shape);
		
		return arrow;
	}
	
	// Retourne le cartouche par défaut qui indique qu'un conteneur contient plus d'enfant qu'il ne peut en afficher. On donne en paramètre l'élément dont on doit utiliser le style.
	public static function getDefaultHaveMoreChild(f_Style : { backgroundColor : UInt, backgroundAlpha : Float, borderColor : UInt, borderAlpha : Float, foregroundColor : UInt, foregroundAlpha : Float}, f_TextFormat : TextFormat) : Sprite
	{
		var result = new Sprite();
		result.graphics.beginFill(f_Style.backgroundColor, f_Style.backgroundAlpha);
		result.graphics.lineStyle(1, f_Style.borderColor, f_Style.borderAlpha);
		result.graphics.drawRect(0, 0, TREEITEMWIDTH, 15);
		
		var text = new TextField();
		text.height = 15;
		text.width = TREEITEMWIDTH;
		text.selectable = false;
		text.text = "V";
		f_TextFormat.align = TextFormatAlign.CENTER;
		text.setTextFormat(f_TextFormat);
				
		result.addChild(text);
		return result;
	}
	
	public static function getDefaultPinOn() : BitmapData
	{
		return new BitmapData(DEFAULT_PINWIDTH, DEFAULT_PINWIDTH, false, 0x00FF00);
	}
	
	public static function getDefaultPinOff() : BitmapData
	{
		return new BitmapData(DEFAULT_PINWIDTH, DEFAULT_PINWIDTH, false, 0xFF0000);
	}

	
}